static OstreeCmdPrivateVTable table = {
impl_ostree_generate_grub2_config,
_ostree_repo_static_delta_dump,
+ _ostree_repo_static_delta_query_exists,
_ostree_repo_static_delta_delete
};
typedef struct {
gboolean (* ostree_generate_grub2_config) (OstreeSysroot *sysroot, int bootversion, int target_fd, GCancellable *cancellable, GError **error);
gboolean (* ostree_static_delta_dump) (OstreeRepo *repo, const char *delta_id, GCancellable *cancellable, GError **error);
+ gboolean (* ostree_static_delta_query_exists) (OstreeRepo *repo, const char *delta_id, gboolean *out_exists, GCancellable *cancellable, GError **error);
gboolean (* ostree_static_delta_delete) (OstreeRepo *repo, const char *delta_id, GCancellable *cancellable, GError **error);
} OstreeCmdPrivateVTable;
return ret;
}
+gboolean
+_ostree_repo_static_delta_query_exists (OstreeRepo *self,
+ const char *delta_id,
+ gboolean *out_exists,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gboolean ret = FALSE;
+ g_autofree char *from = NULL;
+ g_autofree char *to = NULL;
+ g_autofree char *superblock_path = NULL;
+ struct stat stbuf;
+
+ _ostree_parse_delta_name (delta_id, &from, &to);
+ superblock_path = _ostree_get_relative_static_delta_superblock_path (from, to);
+
+ if (fstatat (self->repo_dir_fd, superblock_path, &stbuf, 0) < 0)
+ {
+ if (errno == ENOENT)
+ {
+ *out_exists = FALSE;
+ return TRUE;
+ }
+ else
+ {
+ glnx_set_error_from_errno (error);
+ return FALSE;
+ }
+ }
+ *out_exists = TRUE;
+ return TRUE;
+}
+
gboolean
_ostree_repo_static_delta_dump (OstreeRepo *self,
const char *delta_id,
GCancellable *cancellable,
GError **error);
+gboolean
+_ostree_repo_static_delta_query_exists (OstreeRepo *repo,
+ const char *delta_id,
+ gboolean *out_exists,
+ GCancellable *cancellable,
+ GError **error);
+
gboolean
_ostree_repo_static_delta_dump (OstreeRepo *repo,
const char *delta_id,
static gboolean opt_swap_endianness;
static gboolean opt_inline;
static gboolean opt_disable_bsdiff;
+static gboolean opt_if_not_exists;
#define BUILTINPROTO(name) static gboolean ot_static_delta_builtin_ ## name (int argc, char **argv, GCancellable *cancellable, GError **error)
{ "inline", 0, 0, G_OPTION_ARG_NONE, &opt_inline, "Inline delta parts into main delta", NULL },
{ "to", 0, 0, G_OPTION_ARG_STRING, &opt_to_rev, "Create delta to revision REV", "REV" },
{ "disable-bsdiff", 0, 0, G_OPTION_ARG_NONE, &opt_disable_bsdiff, "Disable use of bsdiff", NULL },
+ { "if-not-exists", 'n', 0, G_OPTION_ARG_NONE, &opt_if_not_exists, "Only generate if a delta does not already exist", NULL },
{ "set-endianness", 0, 0, G_OPTION_ARG_STRING, &opt_endianness, "Choose metadata endianness ('l' or 'B')", "ENDIAN" },
{ "swap-endianness", 0, 0, G_OPTION_ARG_NONE, &opt_swap_endianness, "Swap metadata endianness from host order", NULL },
{ "min-fallback-size", 0, 0, G_OPTION_ARG_STRING, &opt_min_fallback_size, "Minimum uncompressed size in megabytes for individual HTTP request", NULL},
}
if (!ostree_repo_resolve_rev (repo, opt_to_rev, FALSE, &to_resolved, error))
goto out;
+
+ if (opt_if_not_exists)
+ {
+ gboolean does_exist;
+ g_autofree char *delta_id = from_resolved ? g_strconcat (from_resolved, "-", to_resolved, NULL) : g_strdup (to_resolved);
+ if (!ostree_cmd__private__ ()->ostree_static_delta_query_exists (repo, delta_id, &does_exist, cancellable, error))
+ goto out;
+ if (does_exist)
+ {
+ g_print ("Delta %s already exists.\n", delta_id);
+ ret = TRUE;
+ goto out;
+ }
+ }
if (opt_endianness)
{
origrev=$(${CMD_PREFIX} ostree --repo=repo rev-parse test)
${CMD_PREFIX} ostree --repo=repo static-delta generate --empty --to=${origrev}
+${CMD_PREFIX} ostree --repo=repo static-delta generate --if-not-exists --empty --to=${origrev} > out.txt
+assert_file_has_content out.txt "${origrev} already exists"
${CMD_PREFIX} ostree --repo=repo static-delta list | grep ${origrev} || exit 1
${CMD_PREFIX} ostree --repo=repo prune
${CMD_PREFIX} ostree --repo=repo static-delta list | grep ${origrev} || exit 1
newrev=$(${CMD_PREFIX} ostree --repo=repo rev-parse test)
-${CMD_PREFIX} ostree --repo=repo static-delta generate --from=${origrev} --to=${newrev} --inline
+${CMD_PREFIX} ostree --repo=repo static-delta generate --if-not-exists --from=${origrev} --to=${newrev} --inline
+${CMD_PREFIX} ostree --repo=repo static-delta generate --if-not-exists --from=${origrev} --to=${newrev} --inline > out.txt
+assert_file_has_content out.txt "${origrev}-${newrev} already exists"
+# Should regenerate
+${CMD_PREFIX} ostree --repo=repo static-delta generate --from=${origrev} --to=${newrev} --inline > out.txt
+assert_not_file_has_content out.txt "${origrev}-${newrev} already exists"
deltaprefix=$(get_assert_one_direntry_matching repo/deltas '.')
deltadir=$(get_assert_one_direntry_matching repo/deltas/${deltaprefix} '-')